package com.berchen.test;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.UUID;
import java.util.concurrent.CopyOnWriteArrayList;

/**
 * 线程安全的ArrayList：
 * Vector 线程安全但是效率低
 * Collections.synchronizedList(new ArrayList()) 线程安全但是效率低
 * CopyWriteArrayList
 * 现在集合中有一堆元素。正在读取。但这个同时我还要往集合中插入元素。
 * 这时候我就将复制一堆元素，然后再复制的一堆元素中进行插入。这时候读取的还是之前的元素。
 * 当我插入完成之后。读取就会读取新的。旧版本的一堆元素就会被干掉。
 */
public class CopyOnWriteArrayListDemo {

    public static void main(String[] args) {

        // 线程安全的list
        List<String> list = new CopyOnWriteArrayList();
        for (int i = 0; i < 10; i++) {
            new Thread(() -> {
                list.add(UUID.randomUUID().toString());
                System.out.println(Thread.currentThread().getName()+"添加进去了");
            }).start();
        }
        while (Thread.activeCount() > 2) {
            Thread.yield();
        }
        System.out.println(list);

        // 线程不安全的list
        List list1=new ArrayList<>();
        for (int i = 0; i < 50; i++) {
            new Thread(()->{
                list1.add(new Random().nextInt());
            }).start();
        }
        while (Thread.activeCount() > 2) {
            Thread.yield();
        }
        System.out.println(list1);
    }
}
